const writeErr = require('../utils/writeErr')
const xy = require('../utils/xy')
const cartModel = require('../db/cart')
const dishModel = require('../db/dish')

module.exports = {
    // 添加购物车
    async add(req, resp) {
        // 获取post数据
        let { userId, dishId, number, speandkind } = req.body
        if (!userId || !dishId || !number || !speandkind) {
            xy(resp, 401, '数据不能为空！')
            return
        }
        // 先查询
        try {
            let docs = await cartModel.findOne({ userId, dishId, speandkind })
            if (docs) {
                try {
                    docs = await cartModel.updateOne({ userId, dishId, speandkind, number: docs.number + +number })
                    xy(resp, 200, '购物车添加成功！')
                } catch (err) {
                    writeErr(err)
                    xy(resp, 507, '购物车添加失败！')
                }
                return
            }
            try {
                docs = await cartModel.insertMany({ userId, dishId, number, speandkind })
                xy(resp, 200, '购物车添加成功！')
            } catch (err) {
                writeErr(err)
                xy(resp, 507, '购物车添加失败！')
            }
        } catch (err) {
            writeErr(err)
            xy(resp, 507, '购物车添加失败！')
        }
    },

    // 获取当前用户的购物车数量
    async getnum(req, resp) {
        // 接受当前用户ID
        let { userId } = req.params

        try {
            let docs = await cartModel.count({ userId })
            xy(resp, 200, '购物车数量获取成功！', {
                number: docs
            })
        } catch (err) {
            writeErr(err)
            xy(resp, 508, '购物车数量获取失败！')
        }
    },

    // 获取购物车所有商品
    async getall(req, resp) {
        // 接受用户ID
        let { userId } = req.params
        try {
            let docs = await cartModel.find({ userId })
            // 原本的数据不能进行操作 - 只读数据 - 进行深拷贝
            docs = JSON.parse(JSON.stringify(docs))
            // 遍历数组，将数组中的每一个对象获取到- 每个对象中的dishId获取商品数据

            // docs.forEach(async cart => {
            //     // cart.dishId - 商品id - 拿他查询商品数据
            //     let dish = await dishModel.findOne({ _id: cart.dishId })
            //     // 将dish放在cart中
            //     cart.dish = dish
            // })

            // 遍历docs - 创建很多的promise对象 放在数组中
            let arr = []
            docs.forEach(cart => {
                arr.push(dishModel.findOne({ _id: cart.dishId }))
            })
            // 将数组放在promise.all中 - 等所有promise都得到结果后，在一个then中处理所有
            Promise.all(arr).then(arr => {
                // console.log(arr);
                docs.forEach((cart, index) => {
                    docs[index].dish = arr[index]
                })
                xy(resp, 200, '购物车数量获取成功！', {
                    carts: docs
                })
            })

        } catch (err) {
            writeErr(err)
            xy(resp, 509, '购物车商品获取失败！')
        }
    }
}